REST API 与 GraphQL 对比详解
REST 和 GraphQL 是现代 Web 应用中最主流的两种 API 接口设计方式。本页将带你理解两者的核心概念、使用场景、优劣对比以及实战代码示例。
🔍 什么是 REST API?
REST(Representational State Transfer)是一种以资源为中心的 API 设计风格。
方法 | 描述 | 示例 |
---|---|---|
GET | 获取数据 | /users |
POST | 创建数据 | /users |
PUT | 更新资源 | /users/1 |
DELETE | 删除资源 | /users/1 |
🔌 什么是 GraphQL?
GraphQL 是 Facebook 开发的一种 API 查询语言,允许客户端精确指定需要的数据结构。
- 所有请求都通过一个统一入口(通常是
/graphql
)完成。 - 由客户端控制字段选择与嵌套层级。
⚖️ REST 与 GraphQL 对比
项目 | REST | GraphQL |
---|---|---|
请求路径 | 多个 endpoint | 单一 endpoint |
返回字段 | 由后端决定 | 客户端决定 |
数据量 | 易过多或过少 | 精准按需 |
请求次数 | 多接口多次请求 | 可一次请求多个资源 |
缓存支持 | 强(支持 CDN) | 弱(需自建策略) |
学习曲线 | 低 | 较高 |
📦 场景推荐
场景 | 推荐 |
---|---|
快速开发后台管理系统 | REST |
前端自由控制字段、移动端接口共享 | GraphQL |
查询多个资源并组合 | GraphQL |
高性能 + 缓存场景 | REST |
🧑💻 实战代码示例
REST API 示例(Node.js Express)
const express = require("express");
const app = express();
app.use(express.json());
app.get("/users", (req, res) => res.json([{ id: 1, name: "Alice" }]));
app.post("/users", (req, res) => res.status(201).json(req.body));
app.listen(3000, () => console.log("REST API 监听中..."));
GraphQL 示例(Apollo Server)
const { ApolloServer, gql } = require("apollo-server");
const typeDefs = gql\`
type User {
id: ID!
name: String
}
type Query {
users: [User]
}
\`;
const resolvers = {
Query: {
users: () => [{ id: 1, name: "Alice" }]
}
};
const server = new ApolloServer({ typeDefs, resolvers });
server.listen().then(({ url }) => console.log(\`GraphQL 启动于 \${url}\`));
🔎 查询对比示例
REST 请求 | GraphQL 查询语句 |
---|---|
GET /users | query { users { id name } } |
GET /users/1 | query { user(id: 1) { name } } |
POST /users | mutation { createUser(name: "Jay") { id } } |
🧠 常见问题解答
GraphQL 能替代 REST 吗?
不能完全替代,GraphQL 更适用于字段多变、多层嵌套或多端开发场景;REST 在缓存、安全、简单场景下仍有优势。
GraphQL 如何处理缓存?
需借助 Apollo Client 或 Relay 处理缓存,不支持 HTTP 层缓存。
REST API 能控制字段吗?
可以使用自定义字段参数,如 /users?fields=id,name
,但远不如 GraphQL 灵活。